package com.gitee.hifong45;


import java.util.List;
import java.util.Map;

import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

public class Ext {
	
	public static String version() {
		return "0.0.5";
	}

	public static HttpServletRequest getRequest() {
		ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		if(attrs == null) {
			return null;
		}
		return attrs.getRequest();
	}

	/**
	 * RMB金额元转分
	 * @param priceYuan 元(String类型)
	 * @return 分（long型）
	 */
	public static Long yuan2Fen(String priceYuan) {
		String[] parts = priceYuan.split(".");
		Long p1 = Long.parseLong(parts[0]); // 元部分
		Integer p2 = Integer.parseInt(parts[1]); // 角分部分
		
		return p1*100 + p2;
	}
	
	/**
	 * RMB金额分转元
	 * @param priceFen 分（Long类型）
	 * @return 元（String型）
	 */
	public static String fen2Yuan(Long priceFen) {
		if(priceFen < 10) {
			return "0.0" + priceFen; // 小于 ￥0.1的，直接返回 0.0x
		}
		if(priceFen < 100) {
			return "0." + priceFen; // 小于￥1.0的，直接返回 0.xx
		}
		return priceFen/100 + "." + priceFen%100;
	}

	/**
	 * 随机长度Hex
	 * @param length 指定长度
	 * @return 随机的HEX字符串
	 */
	public static String randomHex(Integer length) {
		return RandomUtil.randomString("0123456789ABCDEF", length);
	}
	
	/**
	 *  将byte数组转为十六进制字符串，结果为小写，默认编码是UTF-8
	 *
	 * @param data 被编码的数组
	 * @return 十六进制String
	 */
	public static String hexFrom(byte[] data) {
		return HexUtil.encodeHexStr(data);
	}
	public static String toHex(byte[] data) { return HexUtil.encodeHexStr(data); }

	/**
	 *  将字符串转为十六进制字符串，结果为小写，默认编码是UTF-8
	 *
	 * @param data 被编码的字符串
	 * @return 十六进制String
	 */
	public static String hexFrom(String data) {
		return HexUtil.encodeHexStr(data);
	}
	public static String toHex(String data) { return HexUtil.encodeHexStr(data); }

	/**
	 *  将数字转成十六进制字符串，并可在前面补0
	 *
	 * @param value 数字
	 * @param targetNum 希望的长度，不足补0
	 * @return byte[]
	 */
	public static String hexFrom(Integer value, Integer... targetNum) {
		String _d1 = HexUtil.toHex(value); // 先转成hex字符串
		if( targetNum.length == 1 && targetNum[0] > _d1.length()) {
			_d1 = StrUtil.repeat("0", targetNum[0] - _d1.length()) + _d1;
		}
		return _d1;
	}
	public static String hexFrom(Integer value) { return Ext.hexFrom(value); }
	public static String toHex(Integer value, Integer... targetNum) { return Ext.hexFrom(value, targetNum); }

	/**
	 *  将十六进制字符串转成byte数组
	 *
	 * @param hexStr 十六进制String
	 * @return byte[]
	 */
	public static byte[] hexTo(String hexStr) {
		return HexUtil.decodeHex(hexStr);
	}

	/**
	 * 以16进制格式化输出字节数组
	 * @param bytes 字节数组 
	 * @param arg_num 每个数占几个位，不足自动填充0。默认2(00~FF)
	 * @return 格式化后的字符串
	 */
	public static String formatBytes(byte[] bytes, Integer... arg_num) {
        int num = 2;
        if(arg_num != null && arg_num.length == 1 && arg_num[0] != null) {
            num = arg_num[0];
        }
        StringBuilder sbd = new StringBuilder();
        for(int i=0; i<bytes.length; i++) {
            String str = Integer.toHexString((bytes[i] & 0x000000ff) | 0xffffff00).substring(8-num);
            sbd.append(str);
//            sbd.append(Ext.toHex((int)hex_bytes[i], num)).substring(6);
            if(i>0 && (i+1)%16==0) {
                sbd.append("\n"); // 换行
            } else if(i>0 && (i+1)%8 == 0) {
                sbd.append("   "); // 大空格
            }
            else {
                sbd.append(" "); // 空格
            }
        }
        return sbd.toString();
    }

	public static Ret<Kv> str2Ret(String str) {
		return JSONUtil.toBean(str, new TypeReference<Ret<Kv>>() {}, false);
	}

	public static boolean contains(Object obj, Object ele) {
		if(obj instanceof List && obj.getClass().getName().startsWith("java.util.ImmutableCollections$List")) {
			if(ele == null) {
				return false;
			}
		}
		return ObjectUtil.contains(obj, ele);
	}

	public static Map<String, Object> mapStrToMap(String str) {
		str = str.replaceAll("=", "\\\":\\\"")
				.replaceAll(", *", "\\\",\\\"")
				.replaceAll("\\{ *", "{\\\"")
				.replace("}", "\"}");
		
		return JSONUtil.parseObj(str);
	}
}
